package com.soywer.rpc.rpc10;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.Socket;

import com.caucho.hessian.io.Hessian2Input;
import com.caucho.hessian.io.Hessian2Output;

/**
 * 功能描述：
 *
 * @author 18065916_李猛
 * @since 2021/3/8
 */
public class Stub {

    public static Object getStub(final Class clazz){
        InvocationHandler h = new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
                Socket s = new Socket("127.0.0.1",8888);
                //对象输出流--使用hessian
                Hessian2Output output = new Hessian2Output(s.getOutputStream());
                //类名
                String className = clazz.getName();
                //方法名
                String methodName = method.getName();
                //方法参数类型
                Class[] parameterTypes = method.getParameterTypes();
                output.writeString(className);//对象输出流-写入服务器-写类名
                output.writeString(methodName);//对象输出流-写入服务器-写方法名
                output.writeBytes(HessianUtil.serialize(parameterTypes));//二进制输出流使用hessian序列化-写入服务器-写参数类型
                output.writeBytes(HessianUtil.serialize(args));//二进制输出流使用hessian序列化-写入服务器-写参数
                output.flush();//对象输出流-写入服务器-刷新

                //输入流--使用hessian
                Hessian2Input input = new Hessian2Input(s.getInputStream());
                //输入流-读取服务器，调用指定方法后放回的对象；
                Object o = HessianUtil.deserialize(input.readBytes());

                output.close();
                s.close();
                return o;
            }
        };
        Object o = Proxy.newProxyInstance(clazz.getClassLoader(),new Class[]{clazz},h);
        return o;
    }

}
